package com.spring.schooltest.scheduling;

import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;

// 根据用户输入的进程优先级对进程排序 (1为优先级最大最先运行)
public class Priority {

    public List<MyProcess> ProcessSort(List<MyProcess> notSortProcessList) {
        // 采用Map集合，用于存储进程的优先级和该进程在未排序集合中的位置
        // 第一个Integer表示：该进程在 notSortIndexPriority 中的位置index

        // 第二个Integer表示：该进程所设置的优先级
        Map<Integer, Integer> notSortIndexPriority = new HashMap<>();


        for (int i = 0; i < notSortProcessList.size(); i++) {
            // 取出未排序集合中进程的优先级
            int priority = notSortProcessList.get(i).getPriority();
            // 设置在Map结构中
            notSortIndexPriority.put(i, priority);
        }

        // Map根据value值进行排序
        List<Map.Entry<Integer, Integer>> list = new ArrayList<>(notSortIndexPriority.entrySet());
        Collections.sort(list, new Comparator<Map.Entry<Integer, Integer>>() {

            @Override
            public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {
                return o1.getValue().compareTo(o2.getValue());
            }
        });

        // 排序后的进程集合
        List<MyProcess> sortProcess = new CopyOnWriteArrayList<>();
        for (Map.Entry<Integer, Integer> entry : list) {
            // 通过上述排序后，依次拿取排序后的进程，放入排序集合中
            MyProcess myProcess = notSortProcessList.get(entry.getKey());
            sortProcess.add(myProcess);
        }
        return sortProcess;
    }
    
}
